package com.etown.lucene;

import java.io.File;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**
 * 文件调度检查任务
 * @author AFI
 *
 */
public class FileSchedulerTask implements Runnable{
	//第一次运行
	private boolean firstRun = true;
	//初始文件信息 
	private Map<String, Long> currentFiles = new HashMap<String, Long>();
	//当前文件信息
	private Set<String> newFiles = new HashSet<String>();
	//文件目录
	private String directory = "";
	public String getDirectory() {
		return directory;
	}
	public void setDirectory(String directory) {
		this.directory = directory;
	}
	public FileSchedulerTask() {}
	public FileSchedulerTask(String directory) {
		this.directory = directory;
	}
	
	public void run() {
		File file = new File(directory);
		if(firstRun) {
			firstRun = false;
			loadFileInfo(file);
			System.out.println("------init success-------");
		} else {
			//检查文件是否更新包括add、update
			checkFileUpdate(file);
			checkRemoveFiles();
			newFiles.clear();
		}
	}
	
	/**
	 * 初始化文件信息
	 * @param file
	 */
	private void loadFileInfo(File file) {
		if(file.isFile()) {
			currentFiles.put(file.getAbsolutePath(), file.lastModified());
		} else {
			File[] files = file.listFiles();
			for(int i=0; i<files.length; i++) {
				loadFileInfo(files[i]);
			}
		}
	}
	/**
	 * 检查文件更新
	 * @param file
	 */
	private void checkFileUpdate(File file) {
		if(file.isFile()) {
			newFiles.add(file.getAbsolutePath());
			Long lastModified = currentFiles.get(file.getAbsolutePath());
			//新加入文件
			if(lastModified == null) {
				currentFiles.put(file.getAbsolutePath(), file.lastModified());
				System.out.println("添加文件:" + file.getAbsolutePath());
			} else {
				if(lastModified.doubleValue() != file.lastModified()) {
					currentFiles.put(file.getAbsolutePath(), file.lastModified());
					System.out.println("更新文件" + file.getAbsolutePath());
				}
			}
		} else if(file.isDirectory()) {
			File[] files = file.listFiles();
			//这个目录下没有文件
			if(files == null || files.length == 0) {
				return;
			} else {
				for(int i=0; i<files.length; i++) {
					checkFileUpdate(files[i]);
				}
			}
		}
	}
	
	/**
	 * 检查文件是否移除
	 */
	private void checkRemoveFiles() {
		//newFiles.size() <= currentFiles.size()
		if(newFiles.size() == currentFiles.size()) {
			return;
		}
		Iterator<String> it = currentFiles.keySet().iterator();
		while(it.hasNext()) {
			String fileName = it.next();
			//如果新的文件列表中不存在此名称则删除
			if(!newFiles.contains(fileName)) {
				it.remove();//此处必须是完全移除，而不是仅仅remove(fileName)
				System.out.println("删除文件:" + fileName);
			}
		}
	}
	
}
